[25_04_19]WindowsC++のシステムコール&エンコーディング問題
2025-04-19 | 技術
何日ぐらいかかり、今日でGithub.io用のブログの大筋を完成させた。
この静的ブログを作るのに最も大変だったのは、日本語のディレクトリの処理だった。
もともとは、ファイル名を日本語でするつもりだった。でも、なぜかデバッグしてみても原因が把握できなかった。
変数の内容を見ればロジックの問題はなさそうだったが、ofstreamのコードがエラーを吐いた。
問題のコード:
ofstream f(new_title);
if (f.is_open()) {
f << new_post;
f.close();
} else { cout << "[ofstream] ディレクトリのアクセス不可能\n"; }
ここで f.is_open()を通過せずエラーになっていた。
ここで考えてた可能性は一つしかないはずだと確信していた。
ディレクトリ(=new_title)の設計のミス。これしかないって。
だが、何回も修正したり、確認したり、デバッグしたりしても問題はいたちごっこ...
熱心にグーグルで探してみたさきに、いよいよ原因を理解した。
Windows 10のg++でコンパイルしていたが、どうやらWindows環境のC++の複雑なエンコーディングが問題だったらしい。
ostreamでファイルの生成をしたら、内部的にはシステムコールするようになる。
そのシステムコールのファンクションで、CreateFileA()が使われるが、
このファンクションはWindowsの環境ではANSIエンコーディングのみが認識できるので
UTF-8の日本語を使うとシステムコール失敗になる。
Linux環境では大丈夫らしいけど、Windowsなら一応英語のディレクトリを設定した方がよさそうだ...
俺もタイトルとファイル名を別々にして解決した。